package com.fenda.reflect;

/**
 * Created by huanggc on 2019/11/7.
 */

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 反射：运行状态，知道这个类的所有属性和方法，调用它的任意一个方法和属性
 *
 * Class 类的类
 * Method 方法的类
 * Field 成员变量的类
 * Constructor 构造器的类
 */
public class ReflectDemo {
    public static void main(String[] args) {
        //常规模式
        /*Student s = new Student();
        s.setAge(18);
        s.setName("秦弘");
        s.setLength(2);
        System.out.println(s);*/
        try {
            Class aClass = Class.forName("com.fenda.reflect.Student");//将对应的类加载到jvm
            //获取构造方法
            Constructor constructor = aClass.getConstructor(String.class);
            Object o = constructor.newInstance("秦弘");
            //通过方法setName去修改名称
            Method m = aClass.getMethod("setName",String.class);
            m.invoke(o,"王延峰");
            //通过成员变量name去修改名称
            Field f = aClass.getDeclaredField("name");//getDeclaredField 拿到当前类里面的所有的（含私有）
            f.set(o,"方便面");
            //反射调用toString
            Method toStringMethod = aClass.getDeclaredMethod("toString");
            Object invoke = toStringMethod.invoke(o);
            System.out.println(invoke);

            /*Method[] methods = aClass.getMethods();
            //获取所有方法（公有）
            for(Method m : methods){
                System.out.println(m.getName());
            }*/
            //获取所有字段（公有）
            /*Field[] fields = aClass.getFields();
            for(Field f : fields){
                System.out.println(f.getName());
            }*/
            //获取所有的构造器(公有）
            /*Constructor[] constructors = aClass.getConstructors();
            for(Constructor c : constructors){
                System.out.println(c.getName());
            }*/
        } catch (ClassNotFoundException e) {
            System.out.println("找不到类");
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}
